package com.zp.crm.Aspect.KHAspect;

import java.text.SimpleDateFormat;
import java.util.Date;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;

import com.zp.crm.util.Logioiput.RandomInput;
import com.zp.crm.util.targetLog.Log;
@Component
@Aspect
public class KHAspect {
	/** 
     * try{ 
     *      @Before前置通知 
     *      method.invoke(); 
     *      @AfterRunning返回通知 
     * }catch(e){ 
     *      @AfterThrowing：异常通知， 
     * } 
     * @After 
     * 
     * 告诉Spring这些放在都在那个方法的哪个位置执行 
     * 1）、告诉位置 
     [1]@Before：前置通知，在方法执行之前执行 
     [2]@After：后置通知，在方法执行最终结束之后执行。 
        如果没异常 
     [3]@AfterRunning：返回通知，在方法返回结果之后执行 
     [4]@AfterThrowing：异常通知，在方法抛出异常之后执行 
  	
  	1、编写切入点表达式，来告诉spring是切入哪个方法的这个位置 
     */  
    @Before(value="execution(* com.zp.crm.service.KhService.KhService.*(..)) && @annotation(log)")  
    public void logStart(JoinPoint o,Log log){  
    	//日期转换格式
    	SimpleDateFormat f=new SimpleDateFormat("yyyy-MM-dd");
    	//日期转换格式
    	SimpleDateFormat fodata=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    	//定义方法类型
    	String type="方法开始";
    	//获取今天年月日
    	String riqi="客户信息正常-"+f.format(new Date());
    	//获取今天具体时间
    	String time=fodata.format(new Date());
    	//获取方法文本注释
    	String name=log.name();
    	//获取获取方法名称
    	String signame=o.getSignature().getName();
    	//获取方法参数
    	StringBuffer obj=new StringBuffer("参数为：");
    	Object[] os=o.getArgs();
    	for(int i=0;i<os.length;i++){
    		if(os[i]!=null){
    			obj.append(os[i].toString()+"，");
    		}
    	}
    	StringBuffer str1=new StringBuffer();
    	str1.append("\r\n\r\n\r\n");
    	str1.append("类型："+type+"\r\n");
    	str1.append("时间："+time+"\r\n");
    	str1.append("名称："+name+"\r\n");
    	str1.append("方法："+signame+"\r\n");
    	str1.append(obj.toString()+"\r\n");
    	String basePath =getClass().getResource("../../../../../../../").getFile().toString();  
    	String path = basePath+"/khtxt/" + riqi+".txt"; 
    	RandomInput io=new RandomInput();
    	io.WriteString(path, str1.toString());
    }  
      
    @After(value="execution(* com.zp.crm.service.KhService.KhService.*(..)) && @annotation(log)")  
    public void logEnd(JoinPoint o,Log log){  
    	//日期转换格式
    	SimpleDateFormat f=new SimpleDateFormat("yyyy-MM-dd");
    	//日期转换格式
    	SimpleDateFormat fodata=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    	//定义方法类型
    	String type="方法结束";
    	//获取今天年月日
    	String riqi="客户信息正常-"+f.format(new Date());
    	//获取今天具体时间
    	String time=fodata.format(new Date());
    	//获取方法文本注释
    	String name=log.name();
    	//获取获取方法名称
    	String signame=o.getSignature().getName();
    	//获取方法参数
    	StringBuffer obj=new StringBuffer("参数为：");
    	Object[] os=o.getArgs();
    	for(int i=0;i<os.length;i++){
    		if(os[i]!=null){
    			obj.append(os[i].toString()+"，");
    		}
    	}
    	StringBuffer str1=new StringBuffer();
    	str1.append("\r\n\r\n\r\n");
    	str1.append("类型："+type+"\r\n");
    	str1.append("时间："+time+"\r\n");
    	str1.append("名称："+name+"\r\n");
    	str1.append("方法："+signame+"\r\n");
    	str1.append(obj.toString()+"\r\n");
    	String basePath =getClass().getResource("../../../../../../../").getFile().toString();  
    	String path = basePath+"/khtxt/" + riqi+".txt"; 
    	RandomInput io=new RandomInput();
    	io.WriteString(path, str1.toString());
    }  
      
    @AfterThrowing(value="execution(* com.zp.crm.service.KhService.KhService.*(..)) && @annotation(log)")  
    public void logException(JoinPoint o,Log log){  
    	//日期转换格式
    	SimpleDateFormat f=new SimpleDateFormat("yyyy-MM-dd");
    	//日期转换格式
    	SimpleDateFormat fodata=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    	//定义方法类型
    	String type="方法异常";
    	//获取今天年月日
    	String riqi="客户信息异常-"+f.format(new Date());
    	//获取今天具体时间
    	String time=fodata.format(new Date());
    	//获取方法文本注释
    	String name=log.name();
    	//获取获取方法名称
    	String signame=o.getSignature().getName();
    	//获取方法参数
    	StringBuffer obj=new StringBuffer("参数为：");
    	Object[] os=o.getArgs();
    	for(int i=0;i<os.length;i++){
    		if(os[i]!=null){
    			obj.append(os[i].toString()+"，");
    		}
    	}
    	StringBuffer str1=new StringBuffer();
    	str1.append("\r\n\r\n\r\n");
    	str1.append("类型："+type+"\r\n");
    	str1.append("时间："+time+"\r\n");
    	str1.append("名称："+name+"\r\n");
    	str1.append("方法："+signame+"\r\n");
    	str1.append(obj.toString()+"\r\n");
    	String basePath =getClass().getResource("../../../../../../../").getFile().toString();  
    	String path = basePath+"/khtxt/" + riqi+".txt"; 
    	RandomInput io=new RandomInput();
    	io.WriteString(path, str1.toString());
    }  
      
    @AfterReturning(value="execution(* com.zp.crm.service.KhService.KhService.*(..)) && @annotation(log)")  
    public void logReturn(JoinPoint o,Log log){  
    	//日期转换格式
    	SimpleDateFormat f=new SimpleDateFormat("yyyy-MM-dd");
    	//日期转换格式
    	SimpleDateFormat fodata=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    	//定义方法类型
    	String type="方法完成";
    	//获取今天年月日
    	String riqi="客户信息正常-"+f.format(new Date());
    	//获取今天具体时间
    	String time=fodata.format(new Date());
    	//获取方法文本注释
    	String name=log.name();
    	//获取获取方法名称
    	String signame=o.getSignature().getName();
    	//获取方法参数
    	StringBuffer obj=new StringBuffer("参数为：");
    	Object[] os=o.getArgs();
    	for(int i=0;i<os.length;i++){
    		if(os[i]!=null){
    			obj.append(os[i].toString()+"，");
    		}
    	}
    	StringBuffer str1=new StringBuffer();
    	str1.append("\r\n\r\n\r\n");
    	str1.append("类型："+type+"\r\n");
    	str1.append("时间："+time+"\r\n");
    	str1.append("名称："+name+"\r\n");
    	str1.append("方法："+signame+"\r\n");
    	str1.append(obj.toString()+"\r\n");
    	String basePath =getClass().getResource("../../../../../../../").getFile().toString();  
    	String path = basePath+"/khtxt/" + riqi+".txt"; 
    	RandomInput io=new RandomInput();
    	io.WriteString(path, str1.toString());
    } 
}
